// #include <stdio.h>
// #include <pthread.h>
// #include <stdlib.h>
// #include <unistd.h>
// #include <stdint.h>
// #include <assert.h>

// void *start_routine(void *args)
// {
//     // 一个线程如果出现了异常，会影响其他线程吗？ 会的(线程的健壮性或者鲁棒性较差)
//     // 为什么会影响其他线程？？？ 进程信号。信号是整体发给进程的！！ 这里遇到了段错误（11号信号），所以OS发送11号信号
//     // 给进程，那因为所有线程的pid相等，所以给所有的线程退出了
//     while (1)
//     {
//         printf("new thread create success, name: %s\n", (char *)args);
//         sleep(1);
//         // 这里
//         int *p = NULL;
//         // p = NULL;
//         *p = 0;
//     }
// }

// int main()
// {
//     pthread_t id;
//     // 创建一个轻量级进程(新线程)
//     pthread_create(&id, NULL, start_routine, (void *)"thread new ");
//     while (1)
//     {
//         printf("new thread create success, name: main thread\n");
//         sleep(1);
//     }

//     return 0;
// }

// // ---------------------------------- 创建一批线程 ------------------------------

// typedef struct ThreadData
// {
//     pthread_t tid;
//     char namebuffer[64];
// } ThreadData;

// // 1.这个函数被10个线程执行，这个函数现在是可重入状态
// // 2. 该函数是可重入函数
// // 3. 在函数内定义的变量，都叫做局部变量，具有临时性 -- 今天依旧适用 --- 在多线程情况下，也没有问题 -- 其实每一个线程都有自己独立的栈结构

// void *start_routine(void *args)
// {
//     int cnt = 10;
//     ThreadData *td = (ThreadData *)args; // 这里需要强制转行
//     while (cnt)
//     {
//         printf("new thread create success, name: %s: %x ,cnt: %d\n", td->namebuffer, td->tid, cnt--);
//         sleep(1);
//     }
//     return (void *)106;
// }

// int main()
// {
// #define NUM 10 // 需要多少个线程
//     // 创建一个存放 所有线程的id
//     // void *malloc(size_t size)
//     ThreadData **threads = malloc(NUM * sizeof(ThreadData *)); // 存放线程的数据
//     // 初始化元素 就是创建线程
//     for (int i = 0; i < NUM; i++)
//     {
//         ThreadData *td = malloc(sizeof(ThreadData));
//         snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i + 1);
//         // 创建新线程
//         // pthread_create(&tid, NULL, start_routine, (void *)(intptr_t)i);
//         pthread_create(&td->tid, NULL, start_routine, td);
//         threads[i] = td;
//         // *(threads + i) = td;
//     }
//     // 主线程
//     // 打印关于线程的数据
//     for (int i = 0; i < NUM; i++)
//     {
//         printf("--------------------------------------------------\n");
//         printf("create thread: %s : %d  sucess\n", (*(threads + i))->namebuffer, (*(threads + i))->tid, i);
//         printf("--------------------------------------------------\n");
//     }
//     // 线程等待
//     for (int i = 0; i < NUM; i++)
//     {
//         int *ret = NULL;
//         // int pthread_join(pthread_t thread, void **retval);
//         int n = pthread_join(threads[i]->tid, &ret);
//         assert(n == 0);
//         // printf("join: 0x%x sucess\n", threads[i]->tid);
//         printf("success, number: %d\n", ret);
//     }

//     printf("main thread quit\n");

//     // while (1)
//     // {
//     //     printf("new thread create success, name: main thread\n");
//     //     sleep(1);
//     // }

//     free(threads); // 释放 tids 数组的内存

//     return 0;
// }

//-----------------------------   线程库（c++提供了线程库，不像c语言没有提供线程库） ---------------------------------
#include <iostream>
#include <unistd.h>
#include <thread>

void thread_run()
{
    while (1)
    {
        std::cout << "我是新线程..." << std::endl;
        sleep(1);
    }
}

int main()
{
    std::thread t1(thread_run);

    while (1)
    {
        std::cout << "我是主线程..." << std::endl;
        sleep(1);
    }
    t1.join();
    return 0;
}
